package com.bing.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.StrSpliter;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.bing.common.config.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 上传文件工具
 *
 * @author Bing
 * @date 2021/10/06 22:07
 **/
@Component
@Slf4j
public class MyFileUtil {

    /**
     * 获取端口
     */
    @Value("${server.port}")
    private String port;
    /**
     * 获取ip
     */
    private String ip;

    {
        try {
            ip = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传工具
     *
     * @param file   数据流
     * @param path   路径
     * @param prefix @RequestMapping 前缀
     * @return null 表示失败
     * @author Bing
     * @date 2021/10/08 18:27
     */
    public String upload(MultipartFile file, String prefix, String path) {
        String flag = null;
        try {
            // 获取源文件的名称
            String originalFilename = file.getOriginalFilename();
            // 定义文件的唯一标识（前缀）
            flag = IdUtil.fastSimpleUUID();
            // 获取上传的路径
            String rootFilePath = System.getProperty("user.dir") + path + '/' + flag + "_" + originalFilename;
            // 把文件写入到上传的路径
            FileUtil.writeBytes(file.getBytes(), rootFilePath);
            // 返回结果 url
            return "http://" + ip + ":" + port + prefix + path + '/' + flag;
        } catch (IOException e) {
            log.error("上传文件异常-------", e);
            return null;
        }

    }

    /**
     * 下载文件
     *
     * @param flag     唯一标识
     * @param path     路径
     * @param response HttpServletResponse
     * @return int 0成功 -1失败
     * @author Bing
     * @date 2021/10/08 18:38
     */
    public int getFiles(String flag, String path, HttpServletResponse response) {
        // 新建一个输出流对象
        OutputStream os;
        // 定于文件上传的根路径
        String basePath = System.getProperty("user.dir") + path + '/';
        // 获取所有的文件名称
        List<String> fileNames = FileUtil.listFileNames(basePath);
        // 找到跟参数一致的文件
        String fileName = fileNames.stream().filter(name -> name.contains(flag)).findAny().orElse("");
        try {
            if (StrUtil.isNotEmpty(fileName)) {
                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
                response.setContentType("application/octet-stream");
                // 通过文件的路径读取文件字节流
                byte[] bytes = FileUtil.readBytes(basePath + fileName);
                // 通过输出流返回文件
                os = response.getOutputStream();
                os.write(bytes);
                os.flush();
                os.close();
            }
            return 0;
        } catch (Exception e) {
            log.error("下载文件异常-------", e);
            return -1;
        }
    }

    /**
     * 根据url 删除文件
     *
     * @param url
     * @param path
     * @return boolean
     * @author Bing
     * @date 2021/10/08 20:03
     */
    public boolean deleteFiles(String url, String path) {
        List<String> splitPath = StrSpliter.splitPath(url);
        String flag = splitPath.get(splitPath.size() - 1);
        // 定于文件上传的根路径
        String basePath = System.getProperty("user.dir") + path + '/';
        // 获取所有的文件名称
        List<String> fileNames = FileUtil.listFileNames(basePath);
        // 找到跟参数一致的文件
        String fileName = fileNames.stream().filter(name -> name.contains(flag)).findAny().orElse(null);
        if (fileName != null) {
            // 执行删除
            return FileUtil.del(basePath + '/' + fileName);
        }
        return false;

    }
}
